package com.cc.od.game;

import java.util.*;
/*
@description:
            题目描述
            小王设计了一个简单的猜字谜游戏,游戏的谜面是一个或多个错误的单词（如"nesw"）,玩家需要猜出谜底库中正确的单词。猜中的要求如下:
            
            变换顺序:谜面和谜底单词变换顺序后相同,例如"nwes"和"news"。
            字母去重:谜面和谜底单词去重后的字母序列相同,例如"woo od"和"wo od",去重后都是"w od"。
            玩家需要在谜底库中找到所有满足上述任意条件的单词,并返回结果列表。如果找不到对应的谜底,则返回"not found"或类似信息。
            
            输入描述
            谜面单词列表,以","分隔。
            谜底库单词列表,以","分隔。
            输出描述
            匹配到的正确单词列表,以","分隔。
            如果找不到对应谜底,返回"not found"。
            解题思路
            读取输入:首先,从输入中读取谜面单词列表和谜底库单词列表,可以使用字符串分割函数（如Java中的split）来将逗号分隔的字符串转换为列表。
            
            遍历谜面单词:对于谜面中的每一个单词,执行以下步骤:
            
            遍历谜底库中的每一个单词。
            判断当前谜面单词和谜底单词是否满足变换顺序相同的条件（可以通过比较两个单词排序后的结果是否相同来实现）。
            如果不满足变换顺序条件,则判断去重后的字母序列是否相同（可以将两个单词转换为集合后比较）。
            如果满足任意条件,则将该谜底单词添加到结果列表中,并跳出内层循环（因为已经找到匹配的谜底,无需继续检查其他谜底）。
            处理结果:如果对于某个谜面单词,在谜底库中没有找到匹配的单词,则将"not found"添加到结果列表中（注意,根据题目要求,这可能是在所有谜面单词处理完毕后统一判断,也可能是在处理单个谜面单词时即时判断,具体取决于题目要求和编程习惯）。
            
            输出结果:最后,将结果列表中的单词以逗号分隔的形式输出。
@ClassName WordPuzzleGame
@author chen
@create 2024-09-29 14:18
@Version 1.0
*/
public class WordPuzzleGame {

    public static void main(String[] args)
    {
        String clues = "conection,today";
        // 谜底
        String answers = "connection,wrong,today";

        // 调用函数处理输入并输出结果
        List<String> results = solvePuzzle(clues, answers);

        if(results.isEmpty())
        {
            System.out.println("not found");
        }
        else
        {
            System.out.println(String.join(",", results));
        }
    }

    public static List<String> solvePuzzle(String clues, String answers)
    {
        // 创建一个列表，用于存储匹配的谜底
        List<String> results = new ArrayList<>();
        // 将线索字符串分割成数组
        String[] clueList = clues.split(",");
        // 将谜底字符串分割成数组
        String[] answerList = answers.split(",");
        // 遍历线索数组
        for (String clue : clueList)
        {
            // 创建一个临时列表，用于存储当前线索匹配到的谜底
            List<String> matches= new ArrayList<>();
            // 遍历谜底数组
            for (String answer : answerList)
            {
                // 如果当前谜底与线索构成排列或字谜
                if (isPermutation(clue, answer) || isAnagram(clue, answer))
                {
                    // 将匹配的谜底添加到临时列表
                    matches.add(answer);
                }
            }
            // 如果临时列表不为空
            if (!matches.isEmpty())
            {
                // 将临时列表中的谜底添加到结果列表
                results.addAll(matches);
            }
        }
        // 如果结果列表为空，表示没有找到任何匹配的谜底
        if (results.isEmpty())
        {
            // 返回包含"not found"的单元素列表
            return Collections.singletonList("not found");
        }
        // 返回结果列表
        return results;
    }

    private static boolean isPermutation(String clue, String answer)
    {
        // 如果两个字符串的长度不相等，它们不可能是彼此的排列，直接返回false
        if(clue.length() != answer.length())
        {
            return false;
        }
        char[] clueArr = clue.toCharArray();
        char[] answerArr = answer.toCharArray();
        // 判断两个字符数组是否相等，如果相等，则表示两个字符串是彼此的排列
        return Arrays.equals(clueArr, answerArr);
    }


    private static boolean isAnagram(String clue, String answer)
    {
        // 使用HashSet存储两个字符串中的字符，自动去重
        HashSet<Character> set1 = new HashSet<>();
        HashSet<Character> set2 = new HashSet<>();

        // 遍历clue的字符，添加到set1中
        for (char c : clue.toCharArray())
        {
            set1.add(c);
        }

        // 遍历answer的字符，添加到set2中
        for (char c : answer.toCharArray()) {
             set2.add(c);
        }
        // 判断两个字符集合是否相等，相等则表示两个字符串是变位词
        return set1.equals(set2);
    }
}
